package cruds;

/**
 * 
 * @author Fagner fjas 
 * Lista de reprodução de músicas
 *
 */

import Itens_listas.Musica;
import cruds.Manipula_txt;
import java.util.ArrayList;

public class ListaReproducao {

	private String nome;
	private int id_user;
	private String nome_txt_Playlist;
	private final String DIR_LISTAS = "arquivos/";

	private ArrayList<Musica> lista_musicas;
	private ArrayList<Musica> lista_playList;

	private Manipula_txt txt_music_user;
	private Manipula_txt txt_playList;

	public ListaReproducao(String nome, int id_user) throws Exception {
		this.nome = nome;
		this.id_user = id_user;
		lista_musicas = new ArrayList<Musica>();
		lista_playList = new ArrayList<Musica>();
		nome_txt_Playlist = id_user + "-"
				+ nome.toLowerCase().replaceAll(" ", "_") + ".txt";

		if (nome == "" || nome == null) {
			throw new Exception("Nome da lista não pode ser nulo!");
		}
		if (id_user < 0) {
			throw new Exception(
					"A lista de reprodução tem que pertencer a um usuário");
		}

		txt_music_user = new Manipula_txt(String.valueOf(DIR_LISTAS + id_user),
				"musicas.txt");
		txt_playList = new Manipula_txt(String.valueOf(DIR_LISTAS + id_user),
				nome_txt_Playlist);

		cria_arquivo_lista();
		carregaMusicas();
		carregaPlaylist();

	}

	/**
	 * Cria o arquivo referente a lista de reprodução que está sendo
	 * inicializada.
	 * O Arquivo fica localizado em na pasta do usuário,
	 * Url do arquivo: "di_usuario/list-nome_da_lista.txt"
	 * 
	 */
	protected void cria_arquivo_lista() {
		String nome_arquivo = "list-" + nome.toLowerCase().replaceAll(" ", "_")
				+ ".txt";
		txt_playList = new Manipula_txt(String.valueOf(DIR_LISTAS + id_user),
				nome_arquivo);

		if (txt_playList.getArquivo().exists() == false) {
			txt_playList.diretorio();
			txt_playList.arquivo();
		}
	}

	/**
	 * Grava música em arquivo
	 * 
	 * public void grava_Listas_em_arquivo( Manipula_txt arquivo ){
	 * arquivo.limpa_arquivo();
	 * 
	 */
	public void grava_Listas_em_arquivo(Manipula_txt arquivo,
			ArrayList<Musica> lista) {
		arquivo.limpa_arquivo();
		for (int i = 0; i < lista.size(); i++) {
			arquivo.grava(lista.get(i).toString());
		}
	}

	/**
	 * Faz a leitura dos arquivos referente a playList e lista de músicas do
	 * Usuário e Carrega as músicas referentes a playlist no AraryList "lista_playList"
	 */
	public void carregaPlaylist() {
		ArrayList<String[]> lPlayList = txt_playList.getArrayLinhas();
		ArrayList<String[]> lMusicas = txt_music_user.getArrayLinhas();
		
		for (int i = 0; i < lPlayList.size(); i++) {
			for (int j = 0; j < lMusicas.size(); j++) {
				if (compara(lPlayList.get(i)[5], lMusicas.get(j)[5])) {
				
					Musica musica = new Musica(lMusicas.get(j)[0],
							lMusicas.get(j)[1], lMusicas.get(j)[2],
							lMusicas.get(j)[3], lMusicas.get(j)[4],
							lMusicas.get(j)[5]);

					musica.setEtrelas(Integer.parseInt(lMusicas.get(j)[6]));
					
					lista_playList.add(musica);
				}
			}
		}
		grava_Listas_em_arquivo(txt_playList, lista_playList);
	}
	
	
	/**
	 * Carrega as músicas do usuário no ArrayList "lista_musicas"
	 */
	public void carregaMusicas(){
		ArrayList<String[]> lMusicas = txt_music_user.getArrayLinhas();
		for(int n=0; n<lMusicas.size(); n++){
			Musica musc = new Musica(lMusicas.get(n)[0],
					lMusicas.get(n)[1], lMusicas.get(n)[2],
					lMusicas.get(n)[3], lMusicas.get(n)[4],
					lMusicas.get(n)[5]);
			
			musc.setEtrelas( Integer.parseInt( lMusicas.get(n)[6] ) );
			lista_musicas.add( musc );
		}
	}

	/**
	 * Adiciona uma música na arrayList lista de reprodução e grava a mudança nos arquivos
	 * 
	 * @param musica
	 */
	public void Add_musica(Musica musica){
		if (!verifica_musica_txt(musica, txt_music_user)) {
			if(!verifiva_musica_array(musica)){
				lista_musicas.add(musica);
				grava_Listas_em_arquivo(txt_music_user, lista_musicas);
			}
			
		}			
		
		lista_playList.add(musica);
		grava_Listas_em_arquivo(txt_playList, lista_playList);
	}

	/**
	 * Adiciona uma música a lista de reprodução, sem gravar em arquivo
	 */
	public void add_musicas(Musica musica) {
		
		if( !verifica_musica_txt(musica, txt_music_user) ){
			if( !verifiva_musica_array(musica) ){
				lista_musicas.add(musica);
			}	
		}
		lista_playList.add(musica);
	}

	/**
	 * Verifica se uma música já existe nessa lista de reprodução
	 * 
	 * @param musica
	 *            Musica a ser verificada
	 * @return Boolean
	 */
	public boolean verifiva_musica_array(Musica musica) {
		for (int i = 0; i < lista_musicas.size(); i++) {
			if (musica.equals(lista_musicas.get(i))) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Verifica a existência de uma música em um arquivo txt
	 * 
	 * @param musica
	 *            Objeto música
	 * @param arquivo
	 *            Objeto manipulador de arquivos
	 * @return Boolean
	 */

	public boolean verifica_musica_txt(Musica musica, Manipula_txt arquivo) {
		ArrayList<String> linhas = arquivo.getLinhas();
		String[] dados;

		for (int i = 0; i < linhas.size(); i++) {

			dados = linhas.get(i).split(":");
			if (dados.length >= 6) {
				if (compara(dados[5].replace(" ", ""), musica.getArquivo())) {
					return true;
				}
			}

		}
		return false;
	}

	/**
	 * compara 2 objetos
	 * 
	 * @param Obj
	 * @param Obj2
	 * @return Boolena
	 */
	public static boolean compara(Object Obj, Object Obj2) {
		if (Obj.equals(Obj2)) {
			return true;
		}
		return false;
	}

	/**
	 * Retorna uma música 
	 * @param nome_arquivo	String
	 * @return
	 */
	public Musica getMusica(String nome_arquivo) {
		Musica musica = null;
		for (int i = 0; i < lista_musicas.size(); i++) {
			if (compara(lista_musicas.get(i).getArquivo(), nome_arquivo)) {
				musica = lista_musicas.get(i);
			}
		}
		return musica;
	}
	
	/**
	 * Faz a qualificação das músicas em número de estrelas
	 * @param musica	
	 * @param nEstrelas	
	 */
	public void qualificaMusica( Musica musica, int nEstrelas){
		for(int i=0; i<lista_musicas.size(); i++ ){
			if( musica.equals( lista_musicas.get(i) ) ){
				lista_musicas.get(i).setEtrelas( nEstrelas );
				break;
			}
		}
		
		for(int i=0; i<lista_playList.size(); i++ ){
			if( musica.equals( lista_playList.get(i) ) ){
				lista_musicas.get(i).setEtrelas( nEstrelas );
				break;
			}
		}
		
		grava_Listas_em_arquivo(txt_music_user, lista_musicas);
		grava_Listas_em_arquivo(txt_playList, lista_playList);
		
	}
	
	
	/**
	 * Remove a música indicada do ArrayList
	 * 
	 * @param musica
	 */
	public void Remov_musica(Musica musica) {
		lista_musicas.remove(musica);
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getId_user() {
		return id_user;
	}

	public void setId_user(int id_user) {
		this.id_user = id_user;
	}

	public ArrayList<Musica> getPlayList() {
		return lista_playList;
	}

	public ArrayList<Musica> getListaMusicas() {
		return lista_musicas;
	}

	public void setLista_musicas(ArrayList<Musica> lista_musicas) {
		this.lista_musicas = lista_musicas;
	}
}